//package com.empire.module.system.controller.admin.pki;
//
//import cn.hutool.core.util.StrUtil;
//import com.alibaba.fastjson.JSONObject;
//import com.empire.framework.common.pkivo.*;
//import com.empire.framework.common.util.crypto.Sm3Util;
//import com.empire.framework.common.util.http.OkHttpUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//
//import java.util.HashMap;
//import java.util.Map;
//
///**
// * 第三方令牌核验API调用工具类（忽略SSL证书验证）
// */
//@Slf4j
//@Component
//public class PkiVerifyApiClient {
//
//    // 目标API的请求地址
//    private static final String TOKEN_VERIFY_API_URL = "https://127.0.0.1:17446/query-general-data/service";
//    public static final String RESOURCE_ID_USER_VALIDATE = "/api-A-330100000000-0189-OTHER-1723539272971";
//    public static final String RESOURCE_ID_APP_VALIDATE = "/api-A-330100000000-0189-OTHER-1723541877958";
//    public static final String RESOURCE_ID_USER_TOKEN_INFO =     "/api-A-330100000000-0189-OTHER-1723541217058";
//    public static final String RESOURCE_ID_USER_TOK_INFO =     "/api-A-330100000000-0189-OTHER-1723543810804";
//    public static final String RESOURCE_ID_APP_INFO =     "/api-A-330100000000-0189-OTHER-1723542196425";
//    public static final String RESOURCE_ID_TOKEN_OPERATE =     "/api-A-330100000000-0189-OTHER-1723542953237";
//    public static final String TOKEN_OPERATE_KEY = "65f7e575446e77c1c19b9026f9ab922ab1869786";
//
//    // -------------------------- 原有业务方法保持不变（仅补充日志便于排查） --------------------------
//    public TokenVerifyApiResponse callTokenVerifyApi(String appToken, String userToken, String userTokenId) {
//        Map<String, String> headers = getHeaders(appToken, userToken, RESOURCE_ID_USER_VALIDATE);
//        // 日志：打印请求参数（脱敏敏感信息，便于排查）
//        log.info("发起用户令牌核验请求：appToken=[{}], userToken=[{}], userTokenId=[{}], headers=[{}]",
//                maskSensitiveInfo(appToken), maskSensitiveInfo(userToken), userTokenId, headers);
//        UserTokenVerifyApiRequest requestBody = new UserTokenVerifyApiRequest();
//        requestBody.setUserTokenId(userTokenId);
//        try {
//            String result = OkHttpUtil.getInstance().postJson(TOKEN_VERIFY_API_URL, requestBody, headers);
//            if (StrUtil.isNotEmpty(result)) {
//                log.info("用户令牌核验响应：result=[{}]", result);
//                return JSONObject.parseObject(result, TokenVerifyApiResponse.class);
//            }
//            TokenVerifyApiResponse errorResponse = new TokenVerifyApiResponse();
//            errorResponse.setStatus_code("9999");
//            errorResponse.setMessage("API调用失败，返回空内容。");
//            return errorResponse;
//        } catch (Exception e) {
//            log.error("用户令牌核验API调用失败（appToken=[{}], userTokenId=[{}]",
//                    maskSensitiveInfo(appToken), userTokenId, e);
//            TokenVerifyApiResponse errorResponse = new TokenVerifyApiResponse();
//            errorResponse.setStatus_code("9999");
//            errorResponse.setMessage("API调用失败：" + e.getMessage());
//            return errorResponse;
//        }
//    }
//
//    public UserTokenInfoResponse getUserTokenInfo(String appToken, String userToken, String userTokenId) {
//        Map<String, String> headers = getHeaders(appToken, userToken, RESOURCE_ID_USER_TOKEN_INFO);
//        // 日志：打印请求参数（脱敏敏感信息，便于排查）
//        log.info("发起用户令牌信息查询请求：appToken=[{}], userToken=[{}], userTokenId=[{}]",
//                maskSensitiveInfo(appToken), maskSensitiveInfo(userToken), userTokenId);
//        UserTokenVerifyApiRequest requestBody = new UserTokenVerifyApiRequest();
//        requestBody.setUserTokenId(userTokenId);
//        try {
//            String result = OkHttpUtil.getInstance().postJson(TOKEN_VERIFY_API_URL, requestBody, headers);
//            if (StrUtil.isNotEmpty(result)) {
//                log.info("用户令牌信息查询响应：result=[{}]", result);
//                return JSONObject.parseObject(result, UserTokenInfoResponse.class);
//            }
//            UserTokenInfoResponse errorResponse = new UserTokenInfoResponse();
//            errorResponse.setStatus_code("9999");
//            errorResponse.setMessage("API调用失败，返回空内容。");
//            return errorResponse;
//        } catch (Exception e) {
//            log.error("用户令牌核验API调用失败（appToken=[{}], userTokenId=[{}]",
//                    maskSensitiveInfo(appToken), userTokenId, e);
//            UserTokenInfoResponse errorResponse = new UserTokenInfoResponse();
//            errorResponse.setStatus_code("9999");
//            errorResponse.setMessage("API调用失败：" + e.getMessage());
//            return errorResponse;
//        }
//    }
//
//    /**
//     * 调用第三方用户信息查询API
//     * @param appToken  应用令牌（从请求头获取）
//     * @param userToken 用户令牌（从请求头获取）
//     * @param queryRequest 查询条件（pId/身份证号等可选参数，非null）
//     * @return 用户信息查询响应
//     */
//    public UserInfoQueryResponse getUserInfo(String appToken, String userToken, UserInfoQueryRequest queryRequest) {
//        // 1. 组装请求头
//        Map<String, String> headers = getHeaders(appToken, userToken, RESOURCE_ID_USER_TOK_INFO);
//
//        // 2. 日志：打印请求参数（脱敏敏感信息，如身份证号、手机号）
//        log.info("发起用户信息查询请求：appToken=[{}], userToken=[{}], 查询条件=[pId={}, idcard={}, userName={}, orgCode={}, policeNo={}]",
//                maskSensitiveInfo(appToken),
//                maskSensitiveInfo(userToken),
//                queryRequest.getPId(),
//                maskSensitiveInfo(queryRequest.getIdcard()), // 身份证号脱敏
//                queryRequest.getUserName(),
//                queryRequest.getOrgCode(),
//                queryRequest.getPoliceNo());
//
//        // 3. 调用 OkHttp 发送 POST 请求（复用原有 OkHttpUtil 实例）
//        try {
//            String result = OkHttpUtil.getInstance().postJson(
//                    TOKEN_VERIFY_API_URL, // 同令牌核验的请求地址
//                    queryRequest,         // 新增的查询请求体
//                    headers               // 包含 Content-Type 的完整请求头
//            );
//
//            // 4. 处理响应：非空校验 + JSON 解析
//            if (StrUtil.isNotEmpty(result)) {
//                log.info("用户信息查询响应：result=[{}]", result);
//                return JSONObject.parseObject(result, UserInfoQueryResponse.class);
//            }
//
//            // 5. 空响应处理
//            UserInfoQueryResponse errorResponse = new UserInfoQueryResponse();
//            errorResponse.setStatus_code("9999");
//            errorResponse.setMessage("用户信息查询失败：接口返回空内容");
//            return errorResponse;
//
//        } catch (Exception e) {
//            // 6. 异常处理（统一返回 9999 错误码）
//            log.error("用户信息查询API调用失败（appToken=[{}], 查询条件pId=[{}]",
//                    maskSensitiveInfo(appToken),
//                    queryRequest.getPId(),
//                    e);
//            UserInfoQueryResponse errorResponse = new UserInfoQueryResponse();
//            errorResponse.setStatus_code("9999");
//            errorResponse.setMessage("用户信息查询失败：" + e.getMessage());
//            return errorResponse;
//        }
//    }
//
//    // -------------------------- 2.1.3 应用令牌核验 --------------------------
//    /**
//     * 核验应用令牌的有效性
//     *
//     * @param appToken   应用令牌（从请求头获取）
//     * @param userToken  用户令牌（从请求头获取）
//     * @param appTokenId 应用令牌ID（必传）
//     */
//    public void verifyAppToken(String appToken, String userToken, String appTokenId) {
//        // 1. 构建请求头
//        Map<String, String> headers = getHeaders(appToken, userToken, RESOURCE_ID_APP_VALIDATE);
//
//        // 2. 构建请求体（必传appTokenId）
//        AppTokenVerifyRequest request = new AppTokenVerifyRequest();
//        request.setAppTokenId(appTokenId);
//
//        // 3. 打印请求日志（脱敏敏感信息）
//        log.info("发起应用令牌核验请求：appToken=[{}], userToken=[{}], appTokenId=[{}]",
//                maskSensitiveInfo(appToken),
//                maskSensitiveInfo(userToken),
//                maskSensitiveInfo(appTokenId));
//
//        try {
//            // 4. 调用接口
//            String result = OkHttpUtil.getInstance().postJson(TOKEN_VERIFY_API_URL, request, headers);
//
//            // 5. 处理响应
//            if (result != null) {
//                log.info("应用令牌核验响应：{}", result);
//
//                JSONObject.parseObject(result, TokenVerifyResponse.class);
//                return;
//            }
//
//            // 空响应处理
//            TokenVerifyResponse error = new TokenVerifyResponse();
//            error.setStatus_code("9999");
//            error.setMessage("应用令牌核验失败：响应为空");
//
//        } catch (Exception e) {
//            log.error("应用令牌核验API调用失败（appTokenId=[{}]", maskSensitiveInfo(appTokenId), e);
//            TokenVerifyResponse error = new TokenVerifyResponse();
//            error.setStatus_code("9999");
//            error.setMessage("应用令牌核验失败：" + e.getMessage());
//        }
//    }
//
//    // -------------------------- 2.1.4 应用令牌信息获取 --------------------------
//    /**
//     * 通过应用令牌ID获取应用令牌信息
//     * @param appToken  应用令牌（从请求头获取）
//     * @param userToken 用户令牌（从请求头获取）
//     * @param appTokenId 应用令牌ID（必传）
//     * @return 令牌信息结果
//     */
//    public AppTokenInfoResponse getAppTokenInfo(String appToken, String userToken, String appTokenId) {
//        // 1. 构建请求头
//        Map<String, String> headers = getHeaders(appToken, userToken, RESOURCE_ID_APP_INFO);
//
//        // 2. 构建请求体
//        AppTokenVerifyRequest request = new AppTokenVerifyRequest();
//        request.setAppTokenId(appTokenId);
//
//        // 3. 打印请求日志
//        log.info("发起应用令牌信息查询：appToken=[{}], userToken=[{}], appTokenId=[{}]",
//                maskSensitiveInfo(appToken),
//                maskSensitiveInfo(userToken),
//                maskSensitiveInfo(appTokenId));
//
//        try {
//            // 4. 调用接口
//            String result = OkHttpUtil.getInstance().postJson(TOKEN_VERIFY_API_URL, request, headers);
//
//            // 5. 处理响应
//            if (result != null) {
//                log.info("应用令牌信息响应：{}", result);
//                return JSONObject.parseObject(result, AppTokenInfoResponse.class);
//            }
//
//            // 空响应处理
//            AppTokenInfoResponse error = new AppTokenInfoResponse();
//            error.setStatus_code("9999");
//            error.setMessage("应用令牌信息获取失败：响应为空");
//            return error;
//
//        } catch (Exception e) {
//            log.error("应用令牌信息API调用失败（appTokenId=[{}]", maskSensitiveInfo(appTokenId), e);
//            AppTokenInfoResponse error = new AppTokenInfoResponse();
//            error.setStatus_code("9999");
//            error.setMessage("应用令牌信息获取失败：" + e.getMessage());
//            return error;
//        }
//    }
//
//    // -------------------------- 2.1.5 令牌续期下线 --------------------------
//    /**
//     * 令牌续期或下线操作
//     * @param appToken  应用令牌（从请求头获取）
//     * @param userToken 用户令牌（从请求头获取）
//     * @param request 操作请求参数（包含tokenId、type、action等必传字段）
//     * @return 操作结果
//     */
//    public TokenOperateResponse operateToken(String appToken, String userToken, TokenOperateRequest request) {
//        // 1. 参数校验（必传字段检查）
//        validateOperateRequest(request);
//
//        // 2. 计算签名（sm3(参数拼接 + 固定key)）
////        String sign = calculateSign(request);
////        request.setCallerSign(sign);
//
//        // 3. 构建请求头
//        Map<String, String> headers = getHeaders(appToken, userToken, RESOURCE_ID_TOKEN_OPERATE);
//
//        // 4. 打印请求日志（脱敏敏感信息）
//        log.info("发起令牌操作请求：appToken=[{}], userToken=[{}], tokenId=[{}], type=[{}], action=[{}]",
//                maskSensitiveInfo(appToken),
//                maskSensitiveInfo(userToken),
//                maskSensitiveInfo(request.getTokenId()),
//                request.getType(),
//                request.getAction());
//
//        try {
//            // 5. 调用接口
//            String result = OkHttpUtil.getInstance().postJson(TOKEN_VERIFY_API_URL, request, headers);
//
//            // 6. 处理响应
//            if (result != null) {
//                log.info("令牌操作响应：{}", result);
//                return JSONObject.parseObject(result, TokenOperateResponse.class);
//            }
//
//            // 空响应处理
//            TokenOperateResponse error = new TokenOperateResponse();
//            error.setStatus_code("9999");
//            error.setMessage("令牌操作失败：响应为空");
//            return error;
//
//        } catch (Exception e) {
//            log.error("令牌操作API调用失败（tokenId=[{}], action=[{}]",
//                    maskSensitiveInfo(request.getTokenId()), request.getAction(), e);
//            TokenOperateResponse error = new TokenOperateResponse();
//            error.setStatus_code("9999");
//            error.setMessage("令牌操作失败：" + e.getMessage());
//            return error;
//        }
//    }
//
//    // -------------------------- 工具方法 --------------------------
//    /**
//     * 构建请求头（复用逻辑，包含Content-Type）
//     */
//    private Map<String, String> getHeaders(String appToken, String userToken, String resourceId) {
//        Map<String, String> headers = new HashMap<>();
//        headers.put("app_token_id", appToken);
//        headers.put("user_token_id", userToken);
//        headers.put("resource_id", resourceId);
//        return headers;
//    }
//
//    /**
//     * 敏感信息脱敏（保留前2位和后2位）
//     */
//    private String maskSensitiveInfo(String info) {
//        return info;
////        if (info == null || info.length() <= 4) {
////            return "***";
//        //return info.substring(0, 2) + "***" + info.substring(info.length() - 2);
//    }
//
//    /**
//     * 校验令牌操作请求的必传参数
//     */
//    private void validateOperateRequest(TokenOperateRequest request) {
//        if (request == null) {
//            throw new IllegalArgumentException("令牌操作请求参数不能为空");
//        }
//        if (request.getTokenId() == null) {
//            throw new IllegalArgumentException("令牌ID（tokenId）为必填项");
//        }
//        if (request.getType() == null || (!"app".equals(request.getType()) && !"user".equals(request.getType()))) {
//            throw new IllegalArgumentException("令牌类型（type）必须为app或user");
//        }
//        if (request.getAction() == null || (!"offline".equals(request.getAction()) && !"renew".equals(request.getAction()))) {
//            throw new IllegalArgumentException("操作类型（action）必须为offline或renew");
//        }
//        if (request.getCalledId() == null || !"cli".equals(request.getCalledId())) {
//            throw new IllegalArgumentException("调用方（calledId）必须为cli");
//        }
//        if (request.getCallerTimestamp() == null) {
//            throw new IllegalArgumentException("时间戳（callerTimestamp）为必填项");
//        }
//        if (request.getCallerNounce() == null) {
//            throw new IllegalArgumentException("随机数（callerNounce）为必填项");
//        }
//    }
//
//    /**
//     * 计算签名（sm3(参数值拼接 + 固定key)）
//     * 拼接顺序：tokenId + type + action + calledId + callerTimestamp + callerNounce + key
//     */
//    private String calculateSign(TokenOperateRequest request) {
//        // 实际项目中需替换为真实的SM3加密实现
//        StringBuilder signSource = new StringBuilder();
//        signSource.append(request.getTokenId())
//                .append(request.getType())
//                .append(request.getAction())
//                .append(request.getCalledId())
//                .append(request.getCallerTimestamp())
//                .append(request.getCallerNounce())
//                .append(TOKEN_OPERATE_KEY);
//
//        String sign = Sm3Util.sm3(signSource.toString()); // 假设存在SM3工具类
//        log.debug("签名原始串：{}，计算结果：{}", signSource, maskSensitiveInfo(sign));
//        return sign;
//    }
//}
